package model

import (
	"common/global"
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"time"
)

// IntSlice 自定义类型，用于处理JSON整型切片字段
type IntSlice []int

// MarshalJSON 实现json.Marshaler接口
func (i IntSlice) MarshalJSON() ([]byte, error) {
	if i == nil {
		return []byte("[]"), nil
	}
	return json.Marshal([]int(i))
}

// UnmarshalJSON 实现json.Unmarshaler接口
func (i *IntSlice) UnmarshalJSON(data []byte) error {
	var slice []int
	if err := json.Unmarshal(data, &slice); err != nil {
		return err
	}
	*i = IntSlice(slice)
	return nil
}

// 实现Scanner接口，用于数据库读取时的类型转换
func (i *IntSlice) Scan(value interface{}) error {
	if value == nil {
		*i = make(IntSlice, 0)
		return nil
	}

	switch v := value.(type) {
	case []byte:
		if len(v) == 0 || string(v) == "null" {
			*i = make(IntSlice, 0)
			return nil
		}
		var slice []int
		if err := json.Unmarshal(v, &slice); err != nil {
			return err
		}
		*i = IntSlice(slice)
		return nil
	case string:
		if v == "" || v == "null" {
			*i = make(IntSlice, 0)
			return nil
		}
		var slice []int
		if err := json.Unmarshal([]byte(v), &slice); err != nil {
			return err
		}
		*i = IntSlice(slice)
		return nil
	default:
		return fmt.Errorf("cannot scan %T into IntSlice", value)
	}
}

// 实现Valuer接口，用于数据库写入时的类型转换
func (i IntSlice) Value() (driver.Value, error) {
	if i == nil {
		return "[]", nil
	}
	return json.Marshal([]int(i))
}

type GroupBuy struct {
	Id          int32     `gorm:"column:id;type:int;primaryKey;not null;" json:"id"`
	CreatedAt   time.Time `gorm:"column:created_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`
	UpdateAt    time.Time `gorm:"column:update_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"update_at"`
	Deleted     time.Time `gorm:"column:deleted;type:datetime;default:NULL;" json:"deleted"`
	ProductId   int32     `gorm:"column:product_id;type:int;comment:关联商品的id;not null;" json:"product_id"`                                     // 关联商品的id
	CreatorId   int32     `gorm:"column:creator_id;type:int;comment:发起人id;not null;" json:"creator_id"`                                       // 发起人id
	MemberIds   IntSlice  `gorm:"column:member_ids;type:json;not null" json:"member_ids"`                                                     // 参加人id
	CurrentSize int8      `gorm:"column:current_size;type:tinyint;comment:当前参加人数;not null;" json:"current_size"`                              // 当前参加人数
	MaxSize     int       `gorm:"column:max_size;type:double;comment:最大参加人数;not null;" json:"max_size"`                                       // 最大参加人数
	Price       float64   `gorm:"column:price;type:decimal(10, 2);comment:拼团价格;not null;" json:"price"`                                       // 拼团价格
	ExpireTime  time.Time `gorm:"column:expire_time;type:datetime;comment:过期时间;not null;" json:"expire_time"`                                 // 过期时间
	Status      string    `gorm:"column:status;type:enum('pending', 'success', 'failed');comment:状态;not null;default:pending;" json:"status"` // 状态
}

func (gb *GroupBuy) TableName() string {
	return "group_buy"
}

func (gb *GroupBuy) Create() error {
	return global.Db.Create(gb).Error
}

func (gb *GroupBuy) Detail(groupId int) error {
	return global.Db.Where("id = ?", groupId).Limit(1).Find(&gb).Error
}

func (gb *GroupBuy) Update() error {
	return global.Db.Model(&gb).Updates(&gb).Error
}
